/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gradius.InterfaceGrafica;

import gradius.Elementos.Naves.Chefe;
import gradius.Elementos.Naves.ChefeFactory;
import gradius.Elementos.Naves.Explosao;
import gradius.Elementos.Naves.Vicviper;
import gradius.Elementos.Naves.Nave;
import gradius.Elementos.Naves.NaveAtiradora;
import gradius.Elementos.Naves.NaveFactory;
import gradius.Elementos.Naves.Upgrade;
import gradius.Elementos.StageReader;
import gradius.Elementos.Tipos;
import gradius.Elementos.Tiros.Laser;
import gradius.Elementos.Tiros.Tiro;
import gradius.Util.MP3Player;
import gradius.Util.Timer;
import gradius.Util.TimerListener;
import gradius.Util.Util;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javazoom.jl.decoder.JavaLayerException;

/** Classe que define a tela grafica e seu conteúdo
 * @author Eduardo
 */
public class TelaGrafica extends JPanel implements TimerListener, KeyListener, ActionListener
{
    //Componentes do HUD
    private JPanel HUD;
    private JPanel Upgrades;
    private JButton energia;
    private JButton speedUp;
    private JButton missil;
    private JButton laser;
    private JButton option;
    private JLabel score;
    
    //Outros componentes
    private Tiro auxTiro;
    private Nave auxNave;
    private BackGroundPainter painter;
    private Timer timer;
    private Timer timerTiro1;
    private Timer timerTiro2;
    private Vicviper jogador;
    private Chefe boss;
    private ArrayList<Tiro> tirosAliados = new ArrayList<Tiro>();
    private ArrayList<Tiro> tirosInimigos = new ArrayList<Tiro>();
    private ArrayList<Nave> navesInimigas = new ArrayList<Nave>();
    private ArrayList<Upgrade> upgrades = new ArrayList<Upgrade>();
    private ArrayList<Explosao> explosoes = new ArrayList<Explosao>();
    private int[] bufferTeclado;
    private URL url;
    private JProgressBar medidorVida;

    private int numeroInimigos;
    private int stage;
    private boolean flag;

    private Janela frame;

    MP3Player pl = new MP3Player();

    /** Construtor da classe TelaGrafica
     * @param frame - Referência à Janela onde o jogo é desenhado
     */
    public TelaGrafica(Janela frame) throws FileNotFoundException, IOException
    {
        this.frame = frame;
        this.stage=1;

        HUD = new JPanel(new BorderLayout());
        Upgrades = new JPanel(new FlowLayout());

        medidorVida = new JProgressBar();
        medidorVida.setMaximum(10);
        medidorVida.setMinimum(0);
        medidorVida.setStringPainted(true);
        medidorVida.setString("Energia");
        medidorVida.setValue(10);
        medidorVida.setSize(400, 30);

        energia = new JButton("EnergyUP"); energia.setEnabled(false); energia.addActionListener(this); energia.setFocusable(false);
        speedUp = new JButton("SpeedUP"); speedUp.setEnabled(false); speedUp.addActionListener(this); speedUp.setFocusable(false);
        missil = new JButton("Missile"); missil.setEnabled(false); missil.addActionListener(this); missil.setFocusable(false);
        laser = new JButton("Laser"); laser.setEnabled(false); laser.addActionListener(this); laser.setFocusable(false);
        option = new JButton("Multiple"); option.setEnabled(false); option.addActionListener(this); option.setFocusable(false);
        score = new JLabel();
        score.setText("Score: 0     ");

        this.setLayout(new BorderLayout());
        this.add(HUD,BorderLayout.SOUTH);
        HUD.add(Upgrades,BorderLayout.CENTER);
        HUD.add(medidorVida,BorderLayout.WEST);
        HUD.add(score,BorderLayout.EAST);

        Upgrades.add(speedUp);
        Upgrades.add(missil);
        Upgrades.add(laser);
        Upgrades.add(option);
        Upgrades.add(energia);

        numeroInimigos = StageReader.lerNumeroInimigos(1);
        painter = new BackGroundPainter(this, StageReader.lerImagensCenario(1), StageReader.lerImagensElementos(1));
        this.setBackground(Color.BLACK);
        this.timer = new Timer(this, 50);
        this.jogador = (Vicviper)NaveFactory.getInstance(this, Tipos.tipoNave.VICVIPER, 20, 200);
        this.timerTiro1 = new Timer(this, 400);
        this.timerTiro2 = new Timer(this, 3000);
        this.upgrades.clear();
        this.tirosAliados.clear();
        this.tirosInimigos.clear();
        this.navesInimigas.clear();
        this.explosoes.clear();
        bufferTeclado = new int[5];
        this.setFocusable(true);
        this.addKeyListener(this);

        flag = true;
    }

    /** Construtor da classe TelaGrafica
     *
     * @param stage - fase atual
     * @param j - Objeto da nave Vicviper
     * @param frame - janela do jogo
     * @throws FileNotFoundException - Exceção de arquivo não encontrado
     * @throws IOException - exceção de IO
     */
    public TelaGrafica(int stage, Vicviper j, Janela frame) throws FileNotFoundException, IOException
    {
        this.frame = frame;
        this.stage = stage;

        HUD = new JPanel(new BorderLayout());
        Upgrades = new JPanel(new FlowLayout());

        medidorVida = new JProgressBar();
        medidorVida.setMaximum(10);
        medidorVida.setMinimum(0);
        medidorVida.setStringPainted(true);
        medidorVida.setString("Energia");
        medidorVida.setValue(j.getVidaNave());
        medidorVida.setSize(400, 30);

        energia = new JButton("EnergyUP"); energia.setEnabled(false); energia.addActionListener(this); energia.setFocusable(false);
        speedUp = new JButton("SpeedUP"); speedUp.setEnabled(false); speedUp.addActionListener(this); speedUp.setFocusable(false);
        missil = new JButton("Missile"); missil.setEnabled(false); missil.addActionListener(this); missil.setFocusable(false);
        laser = new JButton("Laser"); laser.setEnabled(false); laser.addActionListener(this); laser.setFocusable(false);
        option = new JButton("Multiple"); option.setEnabled(false); option.addActionListener(this); option.setFocusable(false);
        score = new JLabel();
        score.setText("Score: " + j.getScore() + "     ");

        this.setLayout(new BorderLayout());
        this.add(HUD,BorderLayout.SOUTH);
        HUD.add(Upgrades,BorderLayout.CENTER);
        HUD.add(medidorVida,BorderLayout.WEST);
        HUD.add(score,BorderLayout.EAST);

        Upgrades.add(speedUp);
        Upgrades.add(missil);
        Upgrades.add(laser);
        Upgrades.add(option);
        Upgrades.add(energia);

        numeroInimigos = StageReader.lerNumeroInimigos(stage);
        painter = new BackGroundPainter(this, StageReader.lerImagensCenario(stage), StageReader.lerImagensElementos(stage));
        this.setBackground(Color.BLACK);
        this.timer = new Timer(this, 50);
        this.jogador = j;
        if (jogador.getTipoTiro1() == Tipos.tipoTiro.LASER)
        {
            this.timerTiro1 = new Timer(this, 1000 - (jogador.getNroSpeedUps() * 50));
        }
        else
        {
            this.timerTiro1 = new Timer(this, 400 - (jogador.getNroSpeedUps() * 50));
        }
        this.timerTiro2 = new Timer(this, 3000 - (jogador.getNroSpeedUps() * 50));
        this.upgrades.clear();
        this.tirosAliados.clear();
        this.tirosInimigos.clear();
        this.navesInimigas.clear();
        this.explosoes.clear();
        bufferTeclado = new int[5];
        this.setFocusable(true);
        this.addKeyListener(this);

        flag = true;
    }

    /** Método que inicializa a tela gráfica
     */
    public void inicializar() throws FileNotFoundException, IOException
    {
        timerTiro1.start();
        timerTiro2.start();
        timer.start();
        navesInimigas = StageReader.lerInimigos(this,stage);
        upgrades = StageReader.lerUpgrades(this, stage);
        HUD.setOpaque(false);
        Upgrades.setOpaque(false);
        score.setForeground(Color.white);
        medidorVida.setForeground(Color.red);
        try
        {
                pl.play("sounds/sound" + stage + ".mp3");
        }
        catch (JavaLayerException ex)
        {
                Logger.getLogger(TelaGrafica.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** Método que desenha os elementos na tela
     * @param g - Objeto Graphics para desenho
     */
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;

        painter.Paint(g2);


        for (int i=0; i<tirosAliados.size(); i++)
        {
            tirosAliados.get(i).desenha(g2);
        }

        for (int i=0; i<tirosInimigos.size(); i++)
        {
            tirosInimigos.get(i).desenha(g2);
        }

        for (int i=0; i<jogador.getMultiplos().size(); i++)
        {
            jogador.getMultiplos().get(i).desenha(g2);
        }

        for (int i=0; i<navesInimigas.size(); i++)
        {
            navesInimigas.get(i).desenha(g2);
        }

        if ((numeroInimigos<=0) && !flag)
        {
            boss.desenha(g2);
        }

        for (int i=0; i<explosoes.size(); i++)
        {
            explosoes.get(i).desenha(g2);
        }

        jogador.desenha(g2);

        score.setText("Score: " + jogador.getScore() + "     ");

        for (int i =0; i<upgrades.size(); i++)
        {
            upgrades.get(i).desenha(g2);
        }
    }

    /** Método que atualiza as posições de cada elemento e faz o repaint do painel (chamado pelo timer)
     */
    public void update(long millis)
    {
        if (millis == timerTiro1.getMillis())
        {
            jogador.setTiro1Ready(1);
            jogador.setMultiplosTiro1Ready(1);
        }
        if (millis == timerTiro2.getMillis())
        {
            jogador.setTiro2Ready(1);
            jogador.setMultiplosTiro2Ready(1);
        }
        if (millis == timer.getMillis())
        {
            for (Iterator<Explosao> it = explosoes.iterator(); it.hasNext();)
            {
                Explosao auxExplosao = it.next();
                if (auxExplosao.acabou())
                {
                    it.remove();
                }
                else
                {
                    auxExplosao.incrementaLifeTime();
                }
            }

            if (jogador.getVidaNave() <= 0)
            {
                timerTiro1.finalizar();
                timerTiro2.finalizar();
                timer.finalizar();
                pl.stop();
                frame.dispose();
                Janela4 j = new Janela4(jogador,stage);
            }

            //Executa as ações do jogador
            jogador.executaAcao(this, bufferTeclado, tirosAliados);

            for (int i =0; i<upgrades.size(); i++)
            {
                upgrades.get(i).movimenta();
            }

            for (Iterator<Upgrade> it = upgrades.iterator(); it.hasNext();)
            {
                Upgrade auxUpgrade = it.next();
                if (Util.colisao(auxUpgrade, jogador))
                {
                    it.remove();
                    jogador.addUpgrade();
                }
            }

            //Invoca o boss caso não haja mais naves inimigas
            if ((numeroInimigos<=0) && flag)
            {
                flag = false;
                boss = ChefeFactory.getInstance(this, Tipos.tipoNave.valueOf("CHEFE"+stage), 2000, (int)(this.getBounds().getHeight()/2));
            }

            //Percorre o array de naves inimigas e movimenta
            for (int i = 0; i< navesInimigas.size(); i++)
            {
                navesInimigas.get(i).movimenta();
            }

            //Percorre o array de tiros aliados e movimenta caso eles estejam dentro da tela. Caso não estejam, remove o tiro do array
            for (Iterator<Tiro> it = tirosAliados.iterator() ; it.hasNext() ;)
            {
                auxTiro = it.next();
                if (Util.foraDaTelaTiro(auxTiro, this))
                {
                    it.remove();
                }
                else
                {
                    auxTiro.moveTiro();
                }
            }

            //Percorre o array de tiros inimigos e movimenta caso eles estejam dentro da tela. Caso não estejam, remove o tiro do array
            for (Iterator<Tiro> it = tirosInimigos.iterator() ; it.hasNext() ;)
            {
                auxTiro = it.next();
                if (Util.foraDaTelaTiro(auxTiro, this))
                {
                    it.remove();
                }
                else
                {
                    auxTiro.moveTiro();
                }
            }

            //Colisão de tiros aliados com naves inimigas. Testa também se o tiro aliado é um laser. Se for, é feito o cálculo para ver se o laser vara o inimigo ou some nele.
            for (Iterator<Tiro> it1 = tirosAliados.iterator(); it1.hasNext() ;)
            {
                boolean colidiuTiro = false;
                auxTiro = it1.next();
                for (Iterator<Nave> it2 = navesInimigas.iterator() ; it2.hasNext() ;)
                {
                    if(colidiuTiro)
                    {
                        break;
                    }
                    auxNave = it2.next();
                    if (Util.colisao(auxTiro, auxNave))
                    {
                        if (!(auxTiro instanceof Laser))
                        {
                            jogador.incrementaScore(auxTiro.getDanoTiro());
                            auxNave.decrementaVidaNave(auxTiro.getDanoTiro());
                            it1.remove();
                            colidiuTiro=true;
                        }
                        else
                        {
                            int vidaNave = auxNave.getVidaNave();
                            int vidaLaser = auxTiro.getDanoTiro();
                            if (vidaNave>vidaLaser)
                            {
                                jogador.incrementaScore(vidaLaser);
                            }
                            else
                            {
                                jogador.incrementaScore(vidaNave);
                            }
                            auxNave.decrementaVidaNave(vidaLaser);
                            auxTiro.setDanoTiro(auxTiro.getDanoTiro()-vidaNave);
                            if (auxTiro.getDanoTiro()<=0)
                            {
                                it1.remove();
                                colidiuTiro = true;
                            }
                        }
                        if (auxNave.getVidaNave()<=0)
                        {
                            explosoes.add((Explosao)NaveFactory.getInstance(this, Tipos.tipoNave.EXPLOSAO, auxNave.getElementoCoordenada().getCoordX(), auxNave.getElementoCoordenada().getCoordY()));
                            it2.remove();
                            numeroInimigos--;
                        }
                    }
                }
            }

            //Testa a colisão de tiros do inimigo com o jogador. Remove os tiros que colidiram e atualiza a vida da nave e o medidor de vida
            for (Iterator<Tiro> it = tirosInimigos.iterator() ; it.hasNext() ;)
            {
                auxTiro = it.next();
                if (Util.colisao(auxTiro, jogador))
                {
                    jogador.setVidaNave(jogador.getVidaNave() - auxTiro.getDanoTiro());
                    medidorVida.setValue(jogador.getVidaNave());
                    it.remove();
                }
            }

            //Caso o boss tenha sido invocado, movimenta
            if ((numeroInimigos==0) && !flag)
            {
                boss.movimenta();
                boss.atira(this, tirosInimigos);
            }

            //Percorre o array de naves inimigas procurando pelas que estejam fora da tela. Quando estiverem, são removidas do array e decrementam o contador de naves
            for (Iterator<Nave> it = navesInimigas.iterator() ; it.hasNext() ;)
            {
                auxNave = it.next();
                if (Util.foraDaTela(auxNave, this))
                {
                    it.remove();
                    numeroInimigos--;
                }
            }

            //Percorre o array de naves inimigas para ver se não há colisão com o jogador. Caso haja, decrementa a vida da nave da vida do jogador e remove a nave inimiga do array.
            for (Iterator<Nave> it = navesInimigas.iterator() ; it.hasNext() ;)
            {
                auxNave = it.next();
                if (Util.colisao(auxNave, jogador))
                    {
                        jogador.incrementaScore(auxNave.getVidaNave());
                        jogador.setVidaNave(jogador.getVidaNave() - auxNave.getVidaNave());
                        medidorVida.setValue(jogador.getVidaNave());
                        explosoes.add((Explosao)NaveFactory.getInstance(this, Tipos.tipoNave.EXPLOSAO, auxNave.getElementoCoordenada().getCoordX(), auxNave.getElementoCoordenada().getCoordY()));
                        it.remove();
                        numeroInimigos--;
                    }
            }

            if (flag == false)
            {
                if (Util.colisao(jogador, boss))
                {
                    timer.pause();
                }
                for (Iterator<Tiro> it = tirosAliados.iterator() ; it.hasNext() ;)
                {
                    auxTiro = it.next();
                    if (Util.colisao(auxTiro, boss))
                    {
                        jogador.incrementaScore(auxTiro.getDanoTiro());
                        boss.decrementaVidaNave(auxTiro.getDanoTiro());
                        it.remove();
                        if (boss.getVidaNave()<=0)
                        {
                            timer.pause();
                            try {
                                timerTiro1.finalizar();
                                timerTiro2.finalizar();
                                timer.finalizar();
                                pl.stop();
                                if (stage != 4)
                                {
                                    Janela2 j = new Janela2(stage, jogador, frame);
                                }
                                else
                                {
                                    this.frame.dispose();
                                    Janela4 j = new Janela4(jogador,stage);
                                }
                            } catch (FileNotFoundException ex) {
                                Logger.getLogger(TelaGrafica.class.getName()).log(Level.SEVERE, null, ex);
                            } catch (IOException ex) {
                                Logger.getLogger(TelaGrafica.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }
                }
            }

            //Percorre o array de naves inimigas procurando por naves atiradoras. Quando a nave for atiradora, faz com que ela atire
            for (Iterator<Nave> it = navesInimigas.iterator() ; it.hasNext() ;)
            {
                auxNave = it.next();
                if (auxNave instanceof NaveAtiradora)
                {
                    ((NaveAtiradora)auxNave).atira(this, tirosInimigos);
                }
            }

            //Testa o numero de Upgrades que o jogador tem para poder setar a utilização dos botões
            if (jogador.getNroUpgrade() == 0)
            {
                speedUp.setEnabled(false);
                missil.setEnabled(false);
                laser.setEnabled(false);
                option.setEnabled(false);
                energia.setEnabled(false);
            }
            if (jogador.getNroUpgrade() == 1)
            {
                speedUp.setEnabled(true);
                missil.setEnabled(false);
                laser.setEnabled(false);
                option.setEnabled(false);
                energia.setEnabled(false);
            }
            if (jogador.getNroUpgrade() == 2)
            {
                speedUp.setEnabled(false);
                missil.setEnabled(true);
                laser.setEnabled(false);
                option.setEnabled(false);
                energia.setEnabled(false);
            }
            if (jogador.getNroUpgrade() == 3)
            {
                speedUp.setEnabled(false);
                missil.setEnabled(false);
                laser.setEnabled(true);
                option.setEnabled(false);
                energia.setEnabled(false);
            }
            if (jogador.getNroUpgrade() == 4)
            {
                speedUp.setEnabled(false);
                missil.setEnabled(false);
                laser.setEnabled(false);
                option.setEnabled(true);
                energia.setEnabled(false);
            }
            if (jogador.getNroUpgrade() == 5)
            {
                speedUp.setEnabled(false);
                missil.setEnabled(false);
                laser.setEnabled(false);
                option.setEnabled(false);
                energia.setEnabled(true);
            }
            if (jogador.getNroSpeedUps() >= 3)
            {
                speedUp.setEnabled(false);
                if (jogador.getNroUpgrade() == 1)
                {
                    jogador.addUpgrade();
                }
            }
            if (jogador.getTipoTiro2() == Tipos.tipoTiro.MISSIL)
            {
                missil.setEnabled(false);
                if (jogador.getNroUpgrade() == 2)
                {
                    jogador.addUpgrade();
                }
            }

            if (jogador.getTipoTiro1() == Tipos.tipoTiro.LASER)
            {
                laser.setText("Bullet");
            }
            else
            {
                laser.setText("Laser");
            }

            if (jogador.getMultiplos().size() == 2)
            {
                option.setEnabled(false);
                if (jogador.getNroUpgrade() == 4)
                {
                    jogador.addUpgrade();
                }
            }

            this.repaint();
        }
    }

    public void keyTyped(KeyEvent e)
    {
    }

    /** Método que lê o teclado a partir do KeyEvent
     * @param e - Evento do KeyListener
     */
    public void keyPressed(KeyEvent e)
    {
        if (e.getKeyCode() == KeyEvent.VK_CAPS_LOCK)
        {
            jogador.setVidaNave(10);
            medidorVida.setValue(10);
        }
        if (e.getKeyCode() == KeyEvent.VK_D)
        {
            if (jogador.getNroUpgrade() == 1)
            {
                jogador.incrementaSpeedUps();
                timerTiro1.reTime(timerTiro1.getMillis()-50);
                timerTiro2.reTime(timerTiro2.getMillis()-50);
                jogador.fazerUpgrade();
            }
            if (jogador.getNroUpgrade() == 2)
            {
                jogador.setTipoTiro2(Tipos.tipoTiro.MISSIL);
                jogador.fazerUpgrade();
            }
            if (jogador.getNroUpgrade() == 3)
            {
                if (jogador.getTipoTiro1() == Tipos.tipoTiro.LASER)
                {
                    timerTiro1.reTime(400 - jogador.getNroSpeedUps()*50);
                    jogador.setTipoTiro1(Tipos.tipoTiro.BALA);
                }
                else
                {
                    timerTiro1.reTime(1000 - jogador.getNroSpeedUps()*50);
                    jogador.setTipoTiro1(Tipos.tipoTiro.LASER);
                }
                jogador.fazerUpgrade();
            }
            if (jogador.getNroUpgrade() == 4)
            {
                jogador.adicionaMultiplo(this);
                jogador.fazerUpgrade();
            }
            if (jogador.getNroUpgrade() == 5)
            {
                jogador.setVidaNave(10);
                medidorVida.setValue(jogador.getVidaNave());
                jogador.fazerUpgrade();
            }
        }
        if (e.getKeyCode() == KeyEvent.VK_O)
        {
            jogador.addUpgrade();
        }
        if (e.getKeyCode() == KeyEvent.VK_P)
        {
            if (!(timer.paused()))
            {
                Object[] options = {"Despausar"};
                timer.pause();
                if(JOptionPane.showOptionDialog(null, "Deseja despausar o jogo?", "Jogo Pausado",JOptionPane.YES_OPTION,JOptionPane.INFORMATION_MESSAGE,null,options,options[0]) == JOptionPane.YES_OPTION)
                {
                    timer.unpause();
                }
            }
        }
        if (e.getKeyCode() == KeyEvent.VK_UP)
        {
            bufferTeclado[0] = 1;
        }
        if (e.getKeyCode() == KeyEvent.VK_DOWN)
        {
            bufferTeclado[1] = 1;
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT)
        {
            bufferTeclado[3] = 1;
        }
        if (e.getKeyCode() == KeyEvent.VK_LEFT)
        {
            bufferTeclado[2] = 1;
        }
        if (e.getKeyCode() == KeyEvent.VK_S)
        {
            bufferTeclado[4] = 1;
        }
    }

    /** Método do KeyEvent que reconhece quando a tecla foi solta
     * @param e - Evento do KeyListener
     */
    public void keyReleased(KeyEvent e)
    {
        if (e.getKeyCode() == KeyEvent.VK_UP)
        {
            bufferTeclado[0] = 0;
        }
        if (e.getKeyCode() == KeyEvent.VK_DOWN)
        {
            bufferTeclado[1] = 0;
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT)
        {
            bufferTeclado[3] = 0;
        }
        if (e.getKeyCode() == KeyEvent.VK_LEFT)
        {
            bufferTeclado[2] = 0;
        }
        if (e.getKeyCode() == KeyEvent.VK_S)
        {
            bufferTeclado[4] = 0;
        }
    }

    /** Método responsavel pela resposta ao evento de clique selecionado
     *
     * @param e - Objeto do evento capturado no clique do botão
     */
    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == speedUp)
        {
            jogador.incrementaSpeedUps();
            timerTiro1.reTime(timerTiro1.getMillis()-50);
            timerTiro2.reTime(timerTiro2.getMillis()-50);
            jogador.fazerUpgrade();
        }
        if (e.getSource() == missil)
        {
            jogador.setTipoTiro2(Tipos.tipoTiro.MISSIL);
            jogador.fazerUpgrade();
        }
        if (e.getSource() == laser)
        {
            if (jogador.getTipoTiro1() == Tipos.tipoTiro.LASER)
            {
                timerTiro1.reTime(400 - jogador.getNroSpeedUps()*50);
                jogador.setTipoTiro1(Tipos.tipoTiro.BALA);
            }
            else
            {
                timerTiro1.reTime(1000 - jogador.getNroSpeedUps()*50);
                jogador.setTipoTiro1(Tipos.tipoTiro.LASER);
            }
            jogador.fazerUpgrade();
        }
        if (e.getSource() == option)
        {
            jogador.adicionaMultiplo(this);
            jogador.fazerUpgrade();
        }
        if (e.getSource() == energia)
        {
            jogador.setVidaNave(10);
            medidorVida.setValue(jogador.getVidaNave());
            jogador.fazerUpgrade();
        }
    }
}
